package ljl.alg.jianzhioffer.round2;

/**
 * 我是真会还是假会？
 * 怎么不会了
 *
 * 看来是假会！
 * */
public class _16_pow {
    
    /**
     * 这个是名副其实的 my pow
     * 错误的 pow
     * 不想学了，想打游戏、睡觉
     * 寒心了
     * 就是这么脆弱
     *
     * 这个解释起来也不是很好解释，反正就是这个样子
     *
     * */
    public double myPow_wrong(double x, int n) {
        double res = 1;
        while (n > 0) {
            if ((n & 1) == 1) {
                res *= x;
                n--;
            }
            n >>= 1;
            res *= res;
        }
        return res;
    }
    
    public double myPow(double x, int n) {
        if (x == 0) {
            if (n == 0)
                return 1;
            // 这个情况不用考虑，题目说了 x^n 的范围了
            if (n < 0)
                return Double.POSITIVE_INFINITY;
        }
        // 边界情况可能越界，需要 long
        long b = n;
        if (n < 0) {
            x = 1 / x;
            b = -b;
        }
        
        double res = 1;
        while (b > 0) {
            if ((b & 1) == 1) {
                res *= x;
                b--;
            }
            b >>= 1;
            x *= x;
        }
        return res;
    }
}
